import axios from 'axios'
import { useStore } from '@/stores/index.js'
import { subMinutes } from 'date-fns'
/**
 * 获取当天开始时间（即当天0点）的秒时间戳
 *
 * 此函数用于计算当天开始时间（即0点）的毫秒时间戳，以便于在应用程序中使用统一的时间参考点
 * 它通过创建一个日期对象，设置时间为当天的开始时间，然后获取该时间的毫秒时间戳来实现
 *
 * @returns {number} 当天开始时间的秒时间戳
 */
function getStartOfDayTimestamp () {
  // 创建当前时间的日期对象
  const now = new Date()
  // 创建一个新日期对象，时间设置为当天的开始时间（0点）
  const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate())
  // 返回当天开始时间的毫秒时间戳
  return startOfDay.getTime() / 1000
}
// 导出当天开始时间的秒时间戳
export const timestamp = getStartOfDayTimestamp()


/**
 * 将时间戳转换为格式化的日期字符串
 * 该函数仅返回时间部分，格式为HH:mm
 * @param {number} timestamp - 时间戳，表示从1970年1月1日00:00:00UTC开始的秒数
 * @returns {string} 格式化后的日期字符串
 */
export function formattedTimeFromTimestamp (timestamp) {
  // 创建一个 Date 对象，表示从 1970 年 1 月 1 日 00:00:00 UTC 开始的毫秒数
  const date = new Date(timestamp * 1000);
  // 获取日期和时间的各个部分
  //const year = date.getFullYear();
  // const month = date.getMonth() + 1; // 月份是从 0 开始的，所以要加 1
  //const day = date.getDate();
  const hours = date.getHours();
  const minutes = date.getMinutes();
  //const seconds = date.getSeconds();
  return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`
}



/**
 * 将时间戳转换为格式化的日期字符串
 * 该函数仅返回时间部分，格式为XXXX-XX-XX
 * @param {number} timestamp - 时间戳，表示从1970年1月1日00:00:00UTC开始的秒数
 * @returns {string} 格式化后的日期字符串
 */
export function formattedDateFromTimestamp (timestamp) {
  // 创建一个 Date 对象，表示从 1970 年 1 月 1 日 00:00:00 UTC 开始的毫秒数
  const date = new Date(timestamp * 1000);
  // 获取日期和时间的各个部分
  const year = date.getFullYear();
  const month = date.getMonth() + 1; // 月份是从 0 开始的，所以要加 1
  const day = date.getDate();
  // const hours = date.getHours();
  // const minutes = date.getMinutes();
  //const seconds = date.getSeconds();
  return `${year.toString()}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`
}






/**
 *  IP 查询库
 *
 *  使用方法：
 *  import { locationCityName } from '@/api/tool.js';
 *  在应用启动时调用init函数
 *  locationCityName();
 */
const API_URL = 'https://ip.useragentinfo.com/json'
const EXPIRATION_TIME = 24 * 60 * 60 * 1000 // 一天的毫秒数
export async function fetchDataFromServer () {
  try {
    const response = await axios.get(API_URL)
    if (response.status !== 200) throw new Error('Error retrieving data from server')
    return response.data
  } catch (error) {
    throw new Error(
      error.response ? error.response.data : error.message || 'Error retrieving data from server',
    )
  }
}
export function storeDataInLocalStorage (data) {
  const timestamp = new Date().getTime()
  localStorage.setItem('myData', JSON.stringify({ data, timestamp }))
}
export async function getAreaInfo (callback) {
  const retrievedData = localStorage.getItem('myData')
  if (retrievedData) {
    const parsedData = JSON.parse(retrievedData)
    if (parsedData.timestamp && new Date().getTime() - parsedData.timestamp < EXPIRATION_TIME) {
      console.log('从缓存中获取城市信息:', parsedData.data.city)
      return callback(parsedData.data)
    } else {
      console.log('数据过期，即将从服务器获取数据')
      localStorage.removeItem('myData')
    }
  }
  try {
    const ipInfo = await fetchDataFromServer()
    if (ipInfo.code === 200) {
      storeDataInLocalStorage(ipInfo)
      return callback(ipInfo)
    } else {
      throw new Error('Received non-200 status code from server')
    }
  } catch (error) {
    console.error(error)
    return callback({ error: error.message })
  }
}
// 导出一个初始化函数，用于在应用启动时调用
export function locationCityName () {
  getAreaInfo((result) => {
    // console.info(result);
    const store = useStore()
    if (result.code === 200) {
      // 这里写你自己的逻辑,根据所在地设置 cityId 等参数
      // console.log("locationIP:", result);
      const cityName = result.city.substring(0, result.city.length - 1)
      store.setCityName(cityName) //设置城市名字
      // console.log("cityName city:", cityName);
      //根据城市名字查询 cityId
    } else if (result.error) {
      // 如果无法获取位置信息
      store.setCityName('定位失败')
      console.error('Failed to get area info:', result.error)
    }
    // store.setCityName('定位失败'); // 调试定位失败情况
  })
}



/**
 * 根据区域ID、条件过滤电影院
 * @param {Array} cinemas - 电影院
 * @param {String} districtName - 区域名称，用于筛选特定区域的电影院
 * @returns {Array} - 过滤后的电影院列表
 */
export function filterCinemaByDistrictName (cinemas, districtName) {
  const filteredCinemas = cinemas.filter((cinema) => {
    return cinema.districtName === districtName
  })

  console.log("filteredCinemas:", filteredCinemas);
  return filteredCinemas
}


/**
 * 根据票务标志过滤电影院
 * @param {Array} cinemas - 电影院
 * @param {number} ticketFlag - 票务标志，用于筛选是 0 APP订购  1 前台兑换
 * @returns {Array} - 过滤后的电影院列表
 */
export function filterCinemaByTicketFlag (cinemas, ticketFlag) {
  const filteredCinemas = cinemas.filter((cinema) => {
    // return cinema.eTicketFlag === ticketFlag
    if (ticketFlag === 1) { //前台兑换
      return cinema.eTicketFlag === ticketFlag
    } else if (ticketFlag === 0) { //APP订购
      return cinema.eTicketFlag === 0 || cinema.eTicketFlag === 1
    }
  })
  return filteredCinemas
}

/**
 * 根据是否去过该影院过滤电影院
 *
 * @param {Array} cinemas - 电影院
 * @param {number} isVisited - 是否去过该影院 0 没有 1 去过
 * @returns {Array} - 过滤后的电影院列表
 */
export function filterCinemaByVisited (cinemas, isVisited) {
  const filteredCinemas = cinemas.filter((cinema) => {
    return cinema.isVisited === isVisited
  })
  return filteredCinemas
}


/**
 * 根据距离过滤电影院，越近的排序却靠前
 *
 * @param {Array} cinemas - 电影院
 * @returns {Array} - 过滤后的电影院列表
 */
export function filterCinemaByDistance (cinemas) {
  const filteredCinemas = cinemas.slice()
  filteredCinemas.sort((a, b) => a.distance - b.distance)
  return filteredCinemas
}



/**
 * 获取用户的位置信息（Latitude 和 Longitude）
 * @returns {Promise<Object>} 包含 Latitude 和 Longitude 的对象
 *
 * 使用示例：
 * ```
 * import { getUserGeolocation } from '@/api/tool.js';
 * const Geolocation = await getUserGeolocation();
 *
 *  你可以在这里将 Geolocation.latitude 和 Geolocation.longitude 用于其他逻辑
 *
 * ```
 */
export async function getUserGeolocation () {
  return new Promise((resolve, reject) => {
    if ('geolocation' in navigator) {
      navigator.geolocation.getCurrentPosition(
        (position) => {
          const { latitude, longitude } = position.coords;
          resolve({ latitude, longitude });
        },
        (error) => {
          reject(new Error(`Error obtaining location: ${error.message}`));
        }
      );
    } else {
      reject(new Error('Geolocation is not supported by this browser.'));
    }
  });
}



/**
 * 检测当前排片的电影是否在销售
 *
 * @param {Number} advanceStopMins - 预售提前停止售卖的分钟数，默认15分钟
 * @param {Number} showAt - 电影上映时间戳 单位秒
 * @returns {Boolean} 是否在销售
 */
export function isSell (advanceStopMins = 15, showAt) {
  const showAtDate = new Date(showAt * 1000); // 将 showAt 时间戳转换为 Date 对象
  const stopSellTime = subMinutes(showAtDate, advanceStopMins); // 计算停止售卖时间
  const stopSellTimestamp = Math.floor(stopSellTime.getTime() / 1000); // 将停止售卖时间转换为秒级时间戳
  let currentTime = Math.floor(Date.now() / 1000) // 获取当前时间
  return currentTime < stopSellTimestamp; // 比较当前时间和停止售卖时间
}



/**
 * 获取当前时间的秒级时间戳
 *
 * @returns {number} 当前时间的秒级时间戳
 */
export function getCurrentTimestamp () {
  // 获取当前时间的毫秒数
  const now = Date.now();
  // 将毫秒数转换为秒数并向下取整
  return Math.floor(now / 1000);
}
